package com.ptms.service.impl;

import com.ptms.dto.CoachRegisterDTO;
import com.ptms.dto.LoginDTO;
import com.ptms.dto.StudentRegisterDTO;
import com.ptms.entity.Campus;
import com.ptms.entity.User;
import com.ptms.repository.CampusRepository;
import com.ptms.repository.UserRepository;
import com.ptms.service.AuthService;
import com.ptms.util.JwtUtil;
import com.ptms.util.PasswordUtil;
import com.ptms.vo.ResultVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class AuthServiceImpl implements AuthService {

    private final UserRepository userRepository;
    private final CampusRepository campusRepository;
    private final PasswordUtil passwordUtil;
    private final JwtUtil jwtUtil;

    @Override
    public ResultVO<?> login(LoginDTO loginDTO) {
        // 1. 查询用户是否存在
        User user = userRepository.findByUsername(loginDTO.getUsername())
                .orElseThrow(() -> new RuntimeException("用户名或密码错误"));

        // 2. 验证密码（使用正确的方法名）
        if (!passwordUtil.matchesPassword(loginDTO.getPassword(), user.getPassword())) {
            // 错误修复：补充错误码参数（401表示认证失败）
            return ResultVO.fail(401, "用户名或密码错误");
        }

        // 3. 验证教练账号状态
        if ("coach".equals(user.getUserType())) {
            if (user.getStatus() == 2) {
                // 错误修复：补充错误码（403表示权限不足）
                return ResultVO.fail(403, "您的账号正在审核中，暂无法登录");
            } else if (user.getStatus() == 0) {
                return ResultVO.fail(403, "您的账号已被禁用，请联系管理员");
            }
        }

        // 4. 验证学员账号状态
        if ("student".equals(user.getUserType()) && user.getStatus() == 0) {
            return ResultVO.fail(403, "您的账号已被禁用，请联系管理员");
        }

        // 5. 生成JWT令牌
        String token = jwtUtil.generateToken(user.getUsername());

        // 6. 构造返回数据
        Map<String, Object> data = new HashMap<>();
        data.put("token", token);
        data.put("userId", user.getId());
        data.put("username", user.getUsername());
        data.put("userType", user.getUserType());
        data.put("realName", user.getRealName());
        data.put("campus_id",user.getCampusId());
        return ResultVO.success(data);
    }

    @Override
    @Transactional
    public ResultVO<?> registerStudent(StudentRegisterDTO dto) {
        // 1. 校验用户名
        if (userRepository.existsByUsername(dto.getUsername())) {
            // 错误修复：补充错误码（400表示参数错误）
            return ResultVO.fail(400, "用户名已被占用");
        }

        // 2. 校验手机号
        if (userRepository.existsByPhone(dto.getPhone())) {
            return ResultVO.fail(400, "手机号已被注册");
        }

        // 3. 校验校区
        Optional<Campus> campusOptional = campusRepository.findById(dto.getCampus_id());
        if (campusOptional.isEmpty()) {
            return ResultVO.fail(400, "所选校区不存在");
        }

        // 4. 构建用户实体
        User user = new User();
        user.setUsername(dto.getUsername());
        user.setPassword(passwordUtil.encryptPassword(dto.getPassword())); // 使用正确的加密方法名
        user.setRealName(dto.getRealName());
        user.setPhone(dto.getPhone());
        user.setGender(dto.getGender());
        user.setAge(dto.getAge());
        user.setCampusId(campusOptional.get());
        user.setUserType("student");
        user.setEmail(dto.getEmail());
        user.setStatus((byte) 1);
        user.setCreateTime(new Date());

        // 5. 保存用户
        userRepository.save(user);

        return ResultVO.success("学员注册成功");
    }

    @Override
    @Transactional
    public ResultVO<?> registerCoach(CoachRegisterDTO dto) {
        // 1. 校验用户名
        if (userRepository.existsByUsername(dto.getUsername())) {
            return ResultVO.fail(400, "用户名已被占用");
        }

        // 2. 校验手机号
        if (userRepository.existsByPhone(dto.getPhone())) {
            return ResultVO.fail(400, "手机号已被注册");
        }

        // 3. 校验校区
        Optional<Campus> campusOptional = campusRepository.findById(dto.getCampus_id());
        if (campusOptional.isEmpty()) {
            return ResultVO.fail(400, "所选校区不存在");
        }

        // 4. 构建用户实体
        User user = new User();
        user.setUsername(dto.getUsername());
        user.setPassword(passwordUtil.encryptPassword(dto.getPassword())); // 使用正确的加密方法名
        user.setRealName(dto.getRealName());
        user.setPhone(dto.getPhone());
        user.setGender(dto.getGender());
        user.setAge(dto.getAge());
        user.setCampusId(campusOptional.get());
        user.setUserType("coach");
        user.setEmail(dto.getEmail());
        user.setTeachingYears(dto.getTeachingYears());
        user.setPhoto(dto.getPhoto());
        user.setTeachingExperience(dto.getTeachingExperience());
        user.setStatus((byte) 2);
        user.setCreateTime(new Date());

        // 5. 保存用户
        userRepository.save(user);

        // 使用教练注册专属成功方法
        return ResultVO.successCoachRegister();
    }
}
